class Line {
    /**
     * 
     * @param {IOport} start 
     * @param {IOport} end 
     */
    constructor(start, end) {
        this.start = start;
        this.end = end;
    }
}

/**
 * Auxiliary Line 辅助线
 * 负责在线没有连到的时候显示，当找到端点后辅助线则消失，线创建
 */
class AuxLine {
    /**
     * 
     * @param {int} startx 
     * @param {int} starty 
     * @param {int} endx 
     * @param {int} endy 
     */
    constructor(startx, starty, endx, endy) {
        this.startx = startx;
        this.starty = starty;
        this.endx = endx;
        this.endy = endy;
    }
}


/**
 * 绘制一个可以带文字的矩形
 * @param {int} x 世界坐标系下的x值
 * @param {int} y 世界坐标系下的y值
 * @param {int} w 
 * @param {int} h 
 * @param {String} color 
 * @param {String} text 
 * @param {boolean} center 文字是否居中显示
 * @param {int} lineheight 文字一行的高度
 * @param {int} linemax 单行最大字符数
 */
function drawRect(x, y, w, h, color, text = null, center = false, lineheight= 24, linemax = 14) {
    // 先算得起始点在屏幕空间中的位置
    const screenX = camera.getCanvasX(x);
    const screenY = camera.getCanvasY(y);
    // 设置样式
    ctx.fillStyle = color;
    // 绘制矩形
    ctx.fillRect(screenX, screenY, w, h);
    
    // 绘制文字
    ctx.fillStyle = 'black'
    if (text) { // 如果text非空
        let textX = screenX + 10;
        let textY = screenY + 18;
        // 如果居中
        if (center) {
            ctx.textAlign = 'center';
            textX = screenX + w / 2;
            textY = screenY + 5 + h / 2;
        } else {
            ctx.textAlign = 'left';
        }
        // 绘制
        if (text.length <= linemax) {   // 如果没有超过单行最大字符串则直接绘制，节约性能
            ctx.fillText(text, textX, textY);
        } else {
            let begin = 0;
            while (begin < text.length) {
                subtext = text.substring(begin, begin + linemax);
                ctx.fillText(subtext, textX, textY);
                // 为下一次做准备
                begin += linemax;
                textY += lineheight;
            }            
        }        
    }
}

/**
 * 
 * @param {int} x 
 * @param {int} y 
 * @param {int} w 
 * @param {int} h 
 * @param {String} color 
 * @param {int} linew 
 */
function drawRectStroke(x, y, w, h, color, linew) {
    // 先算得在屏幕空间中的位置
    const screenX = camera.getCanvasX(x);
    const screenY = camera.getCanvasY(y);
    // 绘制矩形
    ctx.strokeStyle = color;
    ctx.lineWidth = linew;
    ctx.strokeRect(screenX, screenY, w, h);
}

/**
 * 绘制一条分割线
 * @param {int} x 世界坐标系下的x值
 * @param {int} y 世界坐标系下的y值
 * @param {int} length 
 * @param {String} color 
 */
function drawDevider(x, y, length, color = 'black') {
    ctx.beginPath();
    ctx.strokeStyle = color;
    ctx.lineWidth = 3;
    ctx.moveTo(camera.getCanvasX(x), camera.getCanvasY(y));
    ctx.lineTo(camera.getCanvasX(x) + length, camera.getCanvasY(y));
    ctx.stroke();
}